package com.grj.parking.drools.a;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.Duration;
import java.time.LocalDateTime;

public class ParkingFeeCalculator {

    // 计算逻辑：免费时间 → 实际计费时长 → 首小时费用 + 后续费用 → 单日封顶
    public static BigDecimal calculate(
            LocalDateTime enterTime,
            LocalDateTime leaveTime,
            BigDecimal firstHourFee,
            BigDecimal afterFirstFee,
            Integer freeMinutes,
            BigDecimal maxDailyFee) {

        // 1. 计算总停放分钟数
        long totalMinutes = Duration.between(enterTime, leaveTime).toMinutes();
        if (totalMinutes <= 0) {
            return BigDecimal.ZERO; // 未停放或时间异常，费用0
        }

        // 2. 扣除免费分钟数，得到实际计费分钟数
        long chargeableMinutes = Math.max(totalMinutes - freeMinutes, 0);
        if (chargeableMinutes == 0) {
            return BigDecimal.ZERO; // 免费时间内，费用0
        }

        // 3. 计算计费小时数（不足1小时按1小时算，可扩展为“半小时计费”）
        double chargeableHours = Math.ceil(chargeableMinutes / 60.0);

        // 4. 计算基础费用（首小时 + 后续小时）
        BigDecimal baseFee;
        if (chargeableHours <= 1) {
            baseFee = firstHourFee; // 不足1小时按首小时费用算
        } else {
            BigDecimal afterHoursFee = afterFirstFee.multiply(
                    BigDecimal.valueOf(chargeableHours - 1)
            );
            baseFee = firstHourFee.add(afterHoursFee);
        }

        // 5. 应用单日最高费用（若配置）
        if (maxDailyFee != null && baseFee.compareTo(maxDailyFee) > 0) {
            return maxDailyFee;
        }

        // 保留2位小数（金额标准）
        return baseFee.setScale(2, RoundingMode.HALF_UP);
    }
}